home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / timer / main.c < prev    next >
C/C++ Source or Header  |  2004-05-10  |  8KB  |  335 lines

  1. /*-------------------------------------------------------------
  2.   main.c : TClock Timer
  3.   (C) Kazuto Sato 1997-2003
  4.   For the license, please read readme.txt.
  5.   
  6.   Written by Kazubon, Nanashi-san
  7. ---------------------------------------------------------------*/
  8.  
  9. #include "tctimer.h"
  10.  
  11. /* Globals */
  12.  
  13. BOOL ExecCommandString(HWND hwnd, const char *command);
  14. PTIMERSTRUCT AddTimerStruct(PTIMERSTRUCT pArray, int len, PTIMERSTRUCT pItem);
  15. PTIMERSTRUCT DelTimerStruct(PTIMERSTRUCT pArray, int len, int index);
  16.  
  17. HINSTANCE g_hInst;                 // instance handle
  18. char      g_mydir[MAX_PATH];       // path to this exe file
  19. BOOL      g_bIniSetting = FALSE;   // save setting to ini file?
  20. char      g_inifile[MAX_PATH];     // ini file name
  21. char      g_langfile[MAX_PATH];    // tclang.txt
  22. HFONT     g_hfontDialog = NULL;    // dialog font
  23. HWND      g_hwndClock = NULL;      // clock window handle
  24. HWND      g_hwndTimer = NULL;      // main window
  25. HICON     g_hIconPlay, g_hIconStop;
  26.                                    // icons to use frequently
  27.  
  28. /* Statics */
  29.  
  30. static int TCTimerMain(void);
  31. static void InitTCTimer(void);
  32. static LRESULT CALLBACK WndProcTimer(HWND, UINT, WPARAM, LPARAM);
  33. static void OnCreate(HWND hwnd);
  34. static void OnDestroy(HWND hwnd);
  35. static void SetOnContextMenu(void);
  36. static void CheckCommandLine(HWND hwnd);
  37.  
  38. /*-------------------------------------------
  39.   WinMain
  40. ---------------------------------------------*/
  41. #ifdef NODEFAULTLIB
  42. void WINAPI WinMainCRTStartup(void)
  43. {
  44.     g_hInst = GetModuleHandle(NULL);
  45.     ExitProcess(TCTimerMain());
  46. }
  47. #else
  48. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  49.     LPSTR lpCmdLine, int nCmdShow)
  50. {
  51.     g_hInst = hInstance;
  52.     return TCTimerMain();
  53. }
  54. #endif
  55.  
  56. /*-------------------------------------------
  57.   main routine
  58. ---------------------------------------------*/
  59. int TCTimerMain(void)
  60. {
  61.     MSG msg;
  62.     WNDCLASS wndclass;
  63.     HWND hwnd;
  64.     
  65.     // not to execute the program twice
  66.     hwnd = FindWindow(CLASS_TCLOCKTIMER, NULL);
  67.     if(hwnd != NULL)
  68.     {
  69.         CheckCommandLine(hwnd);
  70.         return 1;
  71.     }
  72.     
  73.     InitTCTimer();
  74.     
  75.     // register a window class
  76.     wndclass.style         = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  77.     wndclass.lpfnWndProc   = WndProcTimer;
  78.     wndclass.cbClsExtra    = 0;
  79.     wndclass.cbWndExtra    = 0;
  80.     wndclass.hInstance     = g_hInst;
  81.     wndclass.hIcon         = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_TCLOCK));
  82.     wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
  83.     wndclass.hbrBackground = (HBRUSH)(COLOR_3DFACE+1);
  84.     wndclass.lpszMenuName  = NULL;
  85.     wndclass.lpszClassName = CLASS_TCLOCKTIMER;
  86.     RegisterClass(&wndclass);
  87.     
  88.     // create a hidden window
  89.     g_hwndTimer = CreateWindowEx(0,
  90.         CLASS_TCLOCKTIMER, "TClock Timer", WS_OVERLAPPEDWINDOW,
  91.         CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
  92.         NULL, NULL, g_hInst, NULL);
  93.     
  94.     while(GetMessage(&msg, NULL, 0, 0))
  95.     {
  96.         if(g_hDlg && IsWindow(g_hDlg) && IsDialogMessage(g_hDlg, &msg)) ;
  97.         else
  98.         {
  99.             TranslateMessage(&msg);
  100.             DispatchMessage(&msg);
  101.         }
  102.     }
  103.     
  104.     return msg.wParam;
  105. }
  106.  
  107. /*-------------------------------------------
  108.   initialize
  109. ---------------------------------------------*/
  110. void InitTCTimer(void)
  111. {
  112.     GetModuleFileName(g_hInst, g_mydir, MAX_PATH);
  113.     del_title(g_mydir);
  114.     strcpy(g_inifile, g_mydir);
  115.     add_title(g_inifile, "tclock.ini");
  116.     g_bIniSetting = TRUE;
  117.     
  118.     // common/langcode.c
  119.     FindFileWithLangCode(g_langfile, GetUserDefaultLangID(), TCLANGTXT);
  120.     g_hfontDialog = CreateDialogFont();
  121.     
  122.     g_hIconPlay = LoadImage(g_hInst, MAKEINTRESOURCE(IDI_PLAY), IMAGE_ICON,
  123.         16, 16, LR_DEFAULTCOLOR|LR_SHARED);
  124.     g_hIconStop = LoadImage(g_hInst, MAKEINTRESOURCE(IDI_STOP), IMAGE_ICON,
  125.         16, 16, LR_DEFAULTCOLOR|LR_SHARED);
  126.     
  127.     g_hwndClock = GetClockWindow();
  128.     
  129.     // setting of [OnContextMenu] in tclock.ini
  130.     SetOnContextMenu();
  131. }
  132.  
  133. /*-------------------------------------------
  134.   window procedure
  135. ---------------------------------------------*/
  136. LRESULT CALLBACK WndProcTimer(HWND hwnd, UINT message,
  137.     WPARAM wParam, LPARAM lParam)
  138. {
  139.     switch (message)
  140.     {
  141.         case WM_CREATE:
  142.             OnCreate(hwnd);
  143.             return 0;
  144.         case WM_DESTROY:
  145.             OnDestroy(hwnd);
  146.             return 0;
  147.         case WM_TIMER:
  148.             switch (wParam)
  149.             {
  150.                 case IDTIMER_TIMER:
  151.                     OnTimerTimer(hwnd);
  152.                     break;
  153.             }
  154.             return 0;
  155.         // show dialog box
  156.         case TIMERM_SHOWDLG:
  157.             OnShowDialog(hwnd);
  158.             return 0;
  159.         // add item to tcmenu*.txt
  160.         case TIMERM_REQUESTMENU:
  161.             OnRequestMenu(hwnd, FALSE);
  162.             return 0;
  163.         // stop running timer
  164.         case TIMERM_STOP:
  165.             OnStopTimer(hwnd, (int)lParam);
  166.             return 0;
  167.     }
  168.     return DefWindowProc(hwnd, message, wParam, lParam);
  169. }
  170.  
  171. /*-------------------------------------------------------
  172.   WM_CREATE message
  173. ---------------------------------------------------------*/
  174. void OnCreate(HWND hwnd)
  175. {
  176.     PostMessage(hwnd, TIMERM_SHOWDLG, 0, 0);
  177.     SetTimer(hwnd, IDTIMER_TIMER, 1000, NULL);
  178. }
  179.  
  180. /*-------------------------------------------------------
  181.   WM_DESTROY message
  182. ---------------------------------------------------------*/
  183. void OnDestroy(HWND hwnd)
  184. {
  185.     ClearTimer();
  186.     
  187.     KillTimer(hwnd, IDTIMER_TIMER);
  188.     
  189.     if(g_hfontDialog) DeleteObject(g_hfontDialog);
  190.     
  191.     PostQuitMessage(0);
  192. }
  193.  
  194. /*-------------------------------------------
  195.    process command line option
  196. ---------------------------------------------*/
  197. void CheckCommandLine(HWND hwnd)
  198. {
  199.     char name[20], value[20];
  200.     char *p;
  201.     int i;
  202.     BOOL bStop = FALSE;
  203.     
  204.     p = GetCommandLine();
  205.     
  206.     while(*p)
  207.     {
  208.         if(*p == '/')
  209.         {
  210.             p++;
  211.             for(i = 0; *p && *p != ' ' && i < 19; i++)
  212.             {
  213.                 name[i] = *p++;
  214.             }
  215.             name[i] = 0;
  216.             while(*p == ' ') p++;
  217.             
  218.             value[0] = 0;
  219.             if(*p && *p != '/')
  220.             {
  221.                 for(i = 0; *p && i < 19; i++)
  222.                     value[i] = *p++;
  223.                 value[i] = 0;
  224.             }
  225.             
  226.             if(strcmp(name, "stop") == 0)
  227.             {
  228.                 PostMessage(hwnd, TIMERM_STOP, 0, atoi(value));
  229.                 bStop = TRUE;
  230.             }
  231.         }
  232.         else p++;
  233.     }
  234.     
  235.     if(!bStop)
  236.         PostMessage(hwnd, TIMERM_SHOWDLG, 0, 0);
  237. }
  238.  
  239. /*------------------------------------------------
  240.   [OnContextMenu]
  241.   AppN=TClockTimerClass,TIMERM_REQUESTMENU
  242. -------------------------------------------------*/
  243. void SetOnContextMenu(void)
  244. {
  245.     char entry[20], buf[100], cname[80], num[20];
  246.     BOOL b;
  247.     int i;
  248.     
  249.     for(i = 0; ; i++)
  250.     {
  251.         wsprintf(entry, "App%d", i + 1);
  252.         GetMyRegStr("OnContextMenu", entry, buf, 100, "");
  253.         b = FALSE;
  254.         if(buf[0])
  255.         {
  256.             parse(cname, buf, 0, 80);
  257.             parse(num, buf, 1, 20);
  258.             if(strcmp(cname, CLASS_TCLOCKTIMER) == 0)
  259.             {
  260.                 if(TIMERM_REQUESTMENU == atoi(num)) break;
  261.                 else b = TRUE;
  262.             }
  263.         }
  264.         else b = TRUE;
  265.         
  266.         if(b)
  267.         {
  268.             wsprintf(buf, "%s,%d", CLASS_TCLOCKTIMER, TIMERM_REQUESTMENU);
  269.             SetMyRegStr("OnContextMenu", entry, buf);
  270.             break;
  271.         }
  272.     }
  273. }
  274.  
  275. /* -------------------- Utilities ---------------------------------------*/
  276.  
  277. /*-------------------------------------------
  278.   called in PlayFile function
  279. ---------------------------------------------*/
  280. BOOL ExecCommandString(HWND hwnd, const char *command)
  281. {
  282.     SendStringToOther(GetTClockMainWindow(), hwnd, command,
  283.         COPYDATA_EXEC);
  284.     
  285.     return FALSE;
  286. }
  287.  
  288. /*-------------------------------------------
  289.   add a new item to TIMERSTRUCT
  290. ---------------------------------------------*/
  291. PTIMERSTRUCT AddTimerStruct(PTIMERSTRUCT pArray, int len, PTIMERSTRUCT pItem)
  292. {
  293.     PTIMERSTRUCT pNewArray;
  294.     int i;
  295.     
  296.     if(!pArray) len = 0;
  297.     pNewArray = malloc(sizeof(TIMERSTRUCT)*(len + 1));
  298.     
  299.     if(pArray)
  300.     {
  301.         for(i = 0; i < len; i++)
  302.             memcpy(pNewArray + i, pArray + i, sizeof(TIMERSTRUCT));
  303.     }
  304.     else i = 0;
  305.     
  306.     memcpy(pNewArray + i, pItem, sizeof(TIMERSTRUCT));
  307.     
  308.     return pNewArray;
  309. }
  310.  
  311. /*-------------------------------------------
  312.   delete an item from TIMERSTRUCT
  313. ---------------------------------------------*/
  314. PTIMERSTRUCT DelTimerStruct(PTIMERSTRUCT pArray, int len, int index)
  315. {
  316.     PTIMERSTRUCT pNewArray = NULL;
  317.     int i, j;
  318.     
  319.     if(len > 1)
  320.     {
  321.         pNewArray = malloc(sizeof(TIMERSTRUCT)*(len - 1));
  322.         for(i = 0, j = 0; i < len; i++)
  323.         {
  324.             if(i != index)
  325.             {
  326.                 memcpy(pNewArray + j, pArray + i, sizeof(TIMERSTRUCT));
  327.                 j++;
  328.             }
  329.         }
  330.     }
  331.     
  332.     return pNewArray;
  333. }
  334.  
  335.